class MyMeta(type):
    # 类对象，类名，父类元组，类的名称空间
    def __init__(self,*args,**kwargs):
        print("init 执行了，初始化对象")
        print(self)
        print(args)
        print(kwargs)
        print(self.__bases__)
        if not args[0].istitle():
            raise NameError("类名首字母要大写")

    def __new__(cls, *args, **kwargs):
        print("new 执行了,创造 MyMeta 的对象")
        print("cls=",cls)
        print(args)
        print(kwargs)
        #需要调用父类来创建空对象
        #return type.__new__(cls,*args,**kwargs)
        return super().__new__(cls,*args,**kwargs)

class People(metaclass=MyMeta):
    """
    元类演示
    """
    def __init__(self,name,age):
        self.name = name
        self.age = age

#这里类名使用小写会被自定义元类校验
# class dog(metaclass=MyMeta):
#     pass

#type(cls_name,bases,{})

#People("jack",33)
#dog()

#背后 实际上是  type.__call__
#Animal = MyMeta("Animal",(object,),{})

# 如果一个对象可以被调用  obj(),那么一定是触发了 类内的__call__
# 对象()  => 类内 __call__
# 类() => 自定义元类内的 __call__
# 自定义元类() => 内置元类的 __call__